<?php
/*

  Фабрика, которая делает классы, реализующие "контроль доступа"

  PrincipalSecurity( &$principal )
      - $principal       -- к какому принципалу прикрепляться

  -------------------

  // Фабрика (статический метод)

  * &Factory( &$principal, $model_name ) -- вернуть экземпляр класса PrincipalSecurity_<model_name>
      - $principal  -- к какому принципалу прикрепляться
      - $model_name -- название модели "контроля доступа"

  // Политика наследников (конкретных моделей), нужды кэширования модели:

  * OnRestore( &$user_data )  -- вызывается в момент, когда "Identify" восстанавливает принципала из сессии.
                                 Модель может дополнить/расширить этот массив, как ей нужно для дальнейшего
                                 использования. В сессию эти правки класться НЕ БУДУТ
  * OnLogin( &$user_data )    -- после успешного логина by "Login", до складывания в сессию.
                                 Модель может дополнить/расширить этот массив, как ей нужно для дальнейшего
                                 использования, результат будет ПОЛОЖЕН В СЕССИЮ
  * OnGuest( &$user_data )    -- вызывается в момент, когда "Guest" загрузил гостевой профиль.
                                 Модель может дополнить/расширить этот массив, как ей нужно для дальнейшего
                                 использования. В сессию эти правки класться НЕ БУДУТ.
                                 Вообще, как правило достаточно идентичности поведения OnGuest ==> OnLogin,
                                 что и прописано в "предке"

    NB: $user_data -- во всем методы передаётся то, что записано в $principal->data, 
                      оно же извлечено из сессии или будет положено в неё.

  // Основной метод для наследников:

  * Check( &$user_data, $params="" ) - при вызове $principal->Security 
      - $user_data -- то же, что и выше
      - $params    -- параметры, переданные принципалу в его метод.

================================================================== v.1 (kuso@npj)
*/
define( "GRANTED", true );
define( "DENIED",  false );

abstract class RL_Principal_Security
{
	
	/**
	 * Объект принципала
	 *
	 * @var RL_Principal
	 */
	public $principal;
	
	/**
	 * ССылка на RH
	 *
	 * @var RL_SiteRequestHandler
	 */
	public $rh;
  
	/**
	 * Конструктор
	 *
	 * @param RL_Principal $principal
	 */
	public final function __construct( RL_Principal $principal )
	{
		$this->principal = $principal;
		$this->rh = $principal->rh;
	}

  public function onRestore( &$user_data )
  {
  	return true;
  }

  public function onLogin( &$user_data )
  {
  	return true;
  }

  public function onGuest( &$user_data )
  {
  	return $this->OnLogin( $user_data );
  }

  public function check( &$user_data, $params = "" )
  {
  	return DENIED;
  }
  
  /**
   * Фабрика, которая делает классы, реализующие "контроль доступа"
   *
   * @param RL_Principal $principal
   * @param string $model_name
   * @return RL_PrincipalSecurity
   */
  public static function Factory( RL_Principal $principal, $model_name )
  {
  	$class_name = "RL_Principal_Security_".$model_name;
  	
  	// find script or die
  	$principal->rh->useClass($class_name);

  	$product = new $class_name ( $principal );
  	return $product;
  }

// EOC{ PrincipalSecurity }
}


?>
